import json
import requests
from tools.LocationPlugin import get_current_location

# 心知天气API密钥
SENIVERSE_API_KEY = "SQKEF6c8aReMBODAL"

def extract_location_from_text(text, client, model_id):
    """使用豆包AI提取文本中的城市信息"""
    prompt = f"""请从以下文本中提取城市名称（如果有）。
    要求：
    1. 必须以JSON格式返回，格式为：{{"city": "城市名"}}
    2. 城市名不要带"市"字
    3. 如果没有提到城市，返回空字符串作为城市名
    4. 如果文本中提到多个城市，返回第一个城市名
    5. 不要加其他任何内容，不要加markdown格式
    
    文本：{text}"""
    
    try:
        response = client.chat.completions.create(
            model=model_id,
            messages=[
                {"role": "system", "content": "你是一个专门提取地理位置的助手，只返回JSON格式数据"},
                {"role": "user", "content": prompt}
            ]
        )
        
        result = response.choices[0].message.content.strip()
        
        # 清理JSON字符串
        result = result.replace('```json', '').replace('```', '').strip()
        
        # 尝试在文本中查找JSON对象
        start = result.find('{')
        end = result.rfind('}') + 1
        if start != -1 and end > 0:
            result = result[start:end]
        
        # 解析JSON响应
        data = json.loads(result)
        return data.get('city', '')
            
    except Exception as e:
        return ""

def get_location(text, client, model_id):
    # 尝试从文本中提取城市
    location = extract_location_from_text(text, client, model_id)
    
    # 如果没有提取到城市，使用当前位置
    if not location:
        location = get_current_location()
    
    return location

def get_weather_prompt(text, client, model_id):
    # 判断是否是天气相关问题
    prompt = f"""判断以下文本是否在询问天气相关的问题。
    要求:
    1. 必须以JSON格式返回,格式为:{{"is_weather": true/false}}
    2. 如果问题涉及天气、温度、降水、空气质量等天气相关信息,返回true
    3. 其他问题返回false
    4. 不要加其他任何内容
    
    文本:{text}"""
    
    try:
        response = client.chat.completions.create(
            model=model_id, 
            messages=[
                {"role": "system", "content": "你是一个判断问题意图的助手,只返回JSON格式数据"},
                {"role": "user", "content": prompt}
            ]
        )
        
        result = response.choices[0].message.content.strip()
        result = result.replace('```json', '').replace('```', '').strip()
        
        start = result.find('{')
        end = result.rfind('}') + 1
        if start != -1 and end > 0:
            result = result[start:end]
            
        data = json.loads(result)
        is_weather = data.get('is_weather', False)
        
        if not is_weather:
            return ""
            
        result = ""
        # 获取位置信息
        location = get_location(text, client, model_id)
                
        query_result = get_weather(location)
        if 'status_code' not in query_result:
            weather_info = "\n" + json.dumps(query_result)
            prompt = f"\n请根据天气信息的JSON数据回答用户的问题，不要提及JSON。如果用户询问天气状况，开头请说'根据心知天气的数据，{location}的天气情况是'。"
            result += weather_info + prompt

        return result
        
    except Exception as e:
        return ""
# 天气查询API调用函数
def get_weather(location):
    url = f"https://api.seniverse.com/v3/weather/daily.json?" \
          + f"key={SENIVERSE_API_KEY}&location={location}&language=en&unit=c&start=-1&days=5"
    response = requests.get(url)
    return response.json()

# 测试调用
# get_weather_prompt()
